home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 43
/
Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso
/
-serious-
/
comms
/
other
/
atomic2_0
/
atomic.rexx
< prev
next >
Wrap
OS/2 REXX Batch file
|
1999-06-14
|
12KB
|
588 lines
/* * * * * * A T O M I C . R E X X * * * * * */
/* */
/* file: s:atomic.rexx */
/* */
/* by John Chufar */
/* ver 2.0.2 13 Apr 1999 */
/* Enhancements: */
/* -IntelliServe Added */
/* -Added Logging module */
/* -Added Configuration module */
/* */
/* */
/* ************************************************************** */
startup:
/* init the command channel to AmigaDOS and see if TCP is mounted */
ADDRESS COMMAND
" Assign >NIL: TCP: exists "
IF RC = 5 THEN
DO
SAY ' TCP: not mounted ...read docs please... exiting '
SAY ''
EXIT 10
END
startupend:
debug:
/* Use TRACE only for debug--it is very time consuming! */
/* TRACE(I) */
debugend:
titlescreen:
/* display the title screen ... */
SAY ''
SAY ''
SAY ' * * * A T O M I C L O C K * * * '
SAY ' '
SAY ' Version 2.0.2 '
SAY ' 1997, 1998, 1999 '
SAY ' "intelliserve" (TM) Technology ~ iT '
SAY ''
SAY ''
/* argstring$ set module */
argstring$ = ''
numargs = ARG() /* number of args */
IF numargs > 0 THEN ARG argstring$
titlescreenend:
/* defaults */
servercount = 0
TIMEAVG. = 0.1
readconfig:
IF ~OPEN('cf','s:atomic.conf', 'R')
THEN DO
Say '*** Unable to open configuration file, atomic.conf'
Exit 10
END
DO WHILE ~EOF('cf')
instring = READLN('cf')
INTERPRET instring
IF (INDEX(instring,'TIMESERVER') =1)
THEN DO
servercount = servercount + 1
END
END
clcode = CLOSE('cf')
readlog:
IF ~OPEN('lf',LOGFILE, 'R')
THEN DO
Say '*** Unable to open log file, ' LOGFILE
Exit 10
END
SHOWAVG = '0'
IF (AVG='YES') THEN SHOWAVG ='1'
CMPA = 0
CMPA = INDEX(argstring$,'A')
IF CMPA > 0
THEN DO
SHOWAVG = '1'
END
DO i=1 TO servercount
c=0
timesum=0
DO WHILE ~EOF('lf')
logstring = READLN('lf')
IF (INDEX(logstring,TIMESERVER.i) =1)
THEN DO
c = c + 1
TIMESUM.c = WORD(logstring,2)
timesum= TIMESUM.c + timesum
END
END
seekcode = SEEK('lf',0,'B')
IF (c > 0)
THEN DO
TIMEAVG.i = timesum / c
END
IF SHOWAVG > 0
THEN DO
AVGOUT$ = 'AVERAGE CONNECT TIME FOR 'TIMESERVER.i': '
SAY OVERLAY(TIMEAVG.i,AVGOUT$,65,,'.')
END
END
SAY ''
clcode = CLOSE('lf')
sortdata:
/* bubble sort the server data */
loop = servercount - 1
DO j = 1 to loop
k = j+1
DO l = k to servercount
IF TIMEAVG.j > TIMEAVG.l
THEN DO
tempavg = TIMEAVG.j ; tempserv = TIMESERVER.j
TIMEAVG.j = TIMEAVG.l; TIMESERVER.j = TIMESERVER.l
TIMEAVG.l = tempavg; TIMESERVER.l = tempserv
END
END
END
IF ~OPEN('sf','t:sortfile', 'W')
THEN DO
Say '*** Unable to open temp sort file, t:sortfile'
Exit 10
END
DO i=1 TO servercount
outstring = TIMEAVG.i||' '||TIMESERVER.i
wrcode = WRITELN('sf',outstring)
END
clcode = CLOSE('sf')
logfile:
/* open the log file to append */
IF ~Open('lf',LOGFILE, 'A')
THEN DO
Say '*** Unable to append to log file'
Exit 10
END
/* open the tcp channel to the host */
IF ~OPEN('sr','t:sortfile', 'R')
THEN DO
Say '*** Unable to open temp sortfile'
Exit 10
END
connect:
serverstart = TIME('E')
IF ~EOF('sr')
THEN DO
serverstring = READLN('sr')
intelliserver = WORD(serverstring,2)
intelliport = 'TCP:'||intelliserver||'/daytime'
END
ELSE DO
SAY '*** NIST Time Services are not present...exiting'
SAY ''
SAY 'Try again at a later time.'
SAY '**************************************'
EXIT 10
END
SAY 'Connecting to Atomic Clock server 'intelliserver
IF ~OPEN(dt,intelliport, 'R')
THEN DO
SAY 'Connection error with 'intelliserver
serverend = TIME('E')
logdaystring = DATE()
logtimestring = TIME()
serverelapsed = serverend - serverstart
serverlog = intelliserver || " " || serverelapsed ||" "|| logdaystring ||" "||logtimestring
wrcode = WRITELN('lf',serverlog)
CALL connect
END
serverend = TIME('E')
serverelapsed = serverend - serverstart
SAY 'Server connection time: ' serverelapsed
connectend:
decode:
/* get the atomic time from the open file 'dt' */
d = readln(dt) /* dummy read...empty first line */
d = readln(dt)
serverhealth = WORD(d,6)
utcdst = WORD(d,4)
IF (serverhealth ~= 0)
THEN DO
SAY "Server Health: " serverhealth " insufficient...trying next server."
SAY ''
CALL connect
END
SAY "Server Health: " serverhealth " (Excellent)"
tim = SubWord(d, 3, 1)
utcdate=SubWord(d,2,1)
utcday=SubStr(utcdate,7,2)
utcmonth=SubStr(utcdate,4,2)
utcyear=SubStr(utcdate,1,2)
decodend:
oldtime = TIME('N')
/* changed in 1.5 from DATE('B') */
olddate = DATE('I')
Date TIME tim DATE utcday'-'utcmonth'-'utcyear
calculate_timezone:
/* Script to offset the time to local */
/* and calculates your localtime 'error' */
IF ~(Exists('env:sys/locale.prefs'))
THEN DO
Say 'Fatal error *** Env:sys/locale.prefs does not exist ***'
Exit 10
END
IF ~Open(pf, 'env:sys/locale.prefs', 'R')
THEN DO
SAY '*** Unable to open prefs file'
Exit 10
END
dummy = SEEK(pf,384,'B')
d = readch(pf,2)
tzoval = C2D(d)
/* tzoval is the timezone offset in minutes */
gmtflag = 0
IF tzoval > 660 /* if the timeszone is > international date line */
THEN DO
tzoval = 65536 - tzoval /* reverse offset (12 hours or greater */
tzocalc = tzoval/60 /* convert to hours.decimins */
tzocalc = TRUNC(tzocalc,2) /* hours.mm format */
tzohour = TRUNC(tzocalc) /* hours */
tzomin = RIGHT(tzocalc,2) /* extract minutes */
tzomin = tzomin * .6 /* convert decimal to minutes */
tzomin = TRUNC(tzomin) /* discard decimals (seconds) */
tzohour = 24 - tzohour /* complete the offset */
if tzomin > 0 THEN tzohour = tzohour -1
gmtflag = 1
END
IF gmtflag = 0 /* if the timezone is < 12 hours fom GMT */
THEN DO
tzocalc = tzoval/60 /* convert to hours.decimins */
tzocalc = TRUNC(tzocalc,2) /* hours.mm format */
tzohour = TRUNC(tzocalc) /* hours */
tzomin = RIGHT(tzocalc,2) /* extract minutes */
tzomin = tzomin * .6 /* convert decimal to minutes */
tzomin = TRUNC(tzomin) /* discard decimals (seconds) */
END
IF (UTCDST = '00') | (UTCDST >'50') THEN TIMECODE = 'STANDARD'
IF (UTCDST >'00') & (UTCDST <'51') THEN TIMECODE = 'DAYLIGHT'
/* if user enters y or n, this overrides the DST in config file */
CMPY = INDEX(argstring$,'Y')
IF CMPY > 0
THEN DO
TIMECODE = 'DAYLIGHT'
END
CMPN = INDEX(argstring$,'N')
IF CMPN > 0
THEN DO
TIMECODE = 'STANDARD'
END
IF (TIMECODE = 'DAYLIGHT')
THEN DO
tzohour = tzohour -1
END
tzoff$ = "-" || tzohour
IF tzohour > 12
THEN DO
tzoff = 24 - tzohour
IF tzomin > 0 THEN tzoff = tzoff -1 /* Compensate for half hour zones */
tzoff$ = "+" || tzoff
END
SAY 'Time adjusted '|| tzoff$ ||' hours and ' tzomin ' minutes from UTC.'
SAY ''
/* read current system time and extract hours and minutes */
timestring = TIME('N')
mins = SUBSTR(timestring,4,2)
hour = LEFT(timestring,2)
newmins = mins - tzomin
IF newmins < 0
THEN DO
newmins = newmins + 60 /* positive value for minutes */
tzohour = tzohour + 1 /* borrow an hour for substraction */
END
offset = tzohour /* set for Your Time Zone */
localhour = hour - offset
minusday = 0
IF localhour <0
THEN DO
localhour = localhour + 24
minusday = 1
END
newhour = localhour
/* correct for hours and minutes of one character '<10' */
IF localhour <10 THEN newhour = "0" || localhour
IF newmins < 10 THEN newmins = "0" || newmins
/* create the new time string */
newtime = newhour || ":" || newmins ||SUBSTR(timestring,6,3)
/* Correct for the date */
IF (minusday = 0) & (gmtflag = 1) THEN 'DATE TOMORROW'
IF (minusday = 1) & (gmtflag = 0) THEN 'DATE YESTERDAY'
/* ELSE leave the data as TODAY */
/* AmigaDOS DATE commands */
'DATE TIME ' || newtime
'DATE'
'SetClock SAVE'
SAY ''
/* changed in 1.5 from DATE('B') */
newdate = DATE('I')
/* Compensation for initial clock read */
/* Adjust by adding 1 second due to program exec time */
/* Average exec time was .56 seconds on A3000 25MHz */
adjustment:
adjsec = RIGHT(oldtime,2)
adjmin = SUBSTR(oldtime,4,2)
adjhour = LEFT(oldtime,2)
adjsec = adjsec + 1
IF adjsec > 59 THEN
DO
adjsec = 0
adjmin = adjmin + 1
IF adjmin > 60 THEN
DO
adjmin = 0
adjhour = adjhour + 1
IF adjhour > 23 THEN
DO
adjhour = 0
olddate = olddate + 1
END
END
END
/* ensures values are converted to integer types */
adjsec = adjsec + 0
adjmin = adjmin + 0
adjhour = adjhour + 0
adjsecstr$ = adjsec
IF adjsecstr$ = '0' THEN adjsecstr$ = '00'
IF (adjsec > 0 ) & (adjsec < 10) THEN adjsecstr$ = '0' || adjsecstr$
adjminstr$ = adjmin
IF adjminstr$ = '0' THEN adjminstr$ = '00'
IF (adjmin > 0 ) & (adjmin < 10) THEN adjminstr$ = '0' || adjminstr$
adjhourstr$ = adjhour
IF adjhourstr$ = '0' THEN adjhourstr$ = '00'
IF (adjhour > 0 ) & (adjhour < 10) THEN adjhourstr$ = '0' || adjhourstr$
oldtime = adjhourstr$||':'||adjminstr$||':'||adjsecstr$
adjustmentend:
oldtimesecs = timeseccalc(oldtime)
newtimesecs = timeseccalc(newtime)
SAY ' Previous System time was: ' oldtime
SAY ' Current System time is : ' newtime
oldsecs = (olddate * 86400) + oldtimesecs
newsecs = (newdate * 86400) + newtimesecs
secdiff = newsecs - oldsecs
secdiff = ABS(secdiff)
datediff = TRUNC(secdiff / 86400)
compsecdiff = secdiff - (datediff * 86400)
diffstr$ = timediff(compsecdiff)
/* datediff = newdate - olddate */
/* datediff = ABS(datediff) */
SAY ''
SAY ' Time difference was ' datediff ' days and 'diffstr$
SAY ''
logdiff$ = " "||datediff||" days "||diffstr$
/* log successful connection information */
logdaystring = DATE()
logtimestring = TIME()
serverlog = intelliserver || " " || serverelapsed ||" "|| logdaystring ||" "||logtimestring||logdiff$
wrcode = WRITELN('lf',serverlog)
clcode = CLOSE('lf')
EXIT
/* ****************** TIME CALC MODULE ************** */
/* Function to calc timesecs */
timeseccalc: procedure
ARG timestring
SECS = RIGHT(timestring,2)
MINS = SUBSTR(timestring,4,2)
HOURS = LEFT(timestring,2)
timesecs = (HOURS * 3600) + (MINS * 60) + (SECS)
RETURN timesecs
/* Function to converts seconds into HH:MM:SS format */
timediff: procedure
ARG timenumsecs
hours = timenumsecs % 3600
hoursecs = hours * 3600
mins = (timenumsecs - (hoursecs)) % 60
minsecs = mins * 60
secs = timenumsecs - hoursecs - minsecs
hourstr$ = hours
IF (hours < 10) THEN hourstr$ = '0' || hours
minstr$ = mins
IF (mins < 10) THEN minstr$ = '0' || mins
secstr$ = secs
IF (secs < 10) THEN secstr$ = '0' || secs
timeconvstr$ = hourstr$||':'||minstr$||':'||secstr$
RETURN timeconvstr$
/* **************** E N D O F P R O G R A M ****************** */